﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Brainfuck_interpreter
{
	/*Classe representant une instruction */
    class Instr
    {
        char instr;
        public Instr(char c)
        {
            instr = c;
        }

        public char get_char()
        {
            return instr;
        }
    }
	/* Classe representant un interpeteur */
    abstract class Interpret
    {
    
    	/* Delegate representant les fonction lancées par l'interpreteur : void -> void */
        protected delegate void ExecInstr();
        
	/* Le programme a interpreter est une suite d'instructions */
        protected List<Instr> Prog;
        /* Numero de l'intruction courrante */
        protected int ptr_instr;
        /* Association Instruction => Action */
	/* Remarquez l'usage des delegués dans le dictionnaire */
        protected Dictionary<char, ExecInstr> Table;

	/* Methodes à implémenter dans la/les classe(s) fille(s) */
	/* Notez le caractère abstrait des méthodes et l'absence de corps de fonction */
        public abstract int Load_file(string filename);
        public abstract void Exec_prog();

	/* Constructeur */
        public Interpret()
        {
            ptr_instr = new int();
            ptr_instr = 0;
            Prog = new List<Instr>();
            Table = new Dictionary<char, ExecInstr>();
        }
    }
}
